/**************************************************************************** 
 * Meta，一个轻量级的静态分区Hypervisor 
 *
 * 版权(c) , 2022-
 *
 * 作者:
 *      Tupelo Shen <shenwanjiang2013@163.com>
 *
 * Meta是一个自由软件，你可以在遵循GNU GPLv2协议的条件下，重新修改并发布它。
 *
 ***************************************************************************/

#ifndef __ARCH_SPINLOCK__
#define __ARCH_SPINLOCK__

#include <meta.h>

/**
 * TODO: 这是一个最简单的lock实现。
 * 需要进行优化。
 */
typedef volatile uint32_t spinlock_t;

#define SPINLOCK_INITVAL (0)

static inline void spin_lock(spinlock_t* lock)
{
    spinlock_t const ONE = 1;
    spinlock_t tmp;

    asm volatile(
        "1:\n\t"
        "ldaxr %w0, %1 \n\t"
        "cbnz %w0, 1b \n\t"
        "stxr %w0, %w2, %1 \n\t"
        "cbnz %w0, 1b \n\t"
        : "=&r"(tmp), "+Q"(*lock)
        : "r"(ONE));
}

static inline void spin_unlock(spinlock_t* lock)
{
    asm volatile("stlr wzr, %0\n\t" ::"Q"(*lock));
}

#endif /* __ARCH_SPINLOCK__ */
